let a: object
a = {}
a = function () { }


// {} 用来指定对象中可以包含哪些属性
// 语法： {属性名：属性值}
let b: { name: string, age?: number }   //属性名？:类型  表示该可选属性
b = { name: '王总' }

// [xxx: string]表示任意字符串类型的属性名   [xxx: string]: any 表示任意类型的属性 
let c: { name: string, [propName: string]: any }
c = { name: '小王', }


/**
 * 设置函数结构的类型声明
 *      语法： （形参：类型，形参：类型，.....）=> 返回值
 */
let d: (a: number, b: number) => number
d = function (n1, n2): number {
  return n1 + n2
}


/**
 * 数组的类型声明
 *        1.类型[]
 *        2.Array<类型>
 */
// string[] 表示字符串数组
let e: string[]
e = ['a', 'b', 'c']

// number[] 表示数值数组
let f: number[]
f = [1, 2, 3]

let g: Array<number>
g = [1, 2, 3]


/**
 *  元组，固定长度的数组
 *      语法: [类型，类型，类型...]
 */
let h: [string, string]
h = ['hello', 'abc']

/**
 * enum 枚举 
 */
enum Sex {
  Male = 1,
  Female = 0
}

let i: { name: string, age: number, sex: Sex }
i = {
  name: '小王',
  age: 18,
  sex: Sex.Female
}
// console.log(i.sex === Sex.Female)

// let j: string | number
// & 表示同时
let j: { name: string } & { age: number }
j = {
  name: '王总',
  age: 15
}


// 类型的别名
type mytType = 1 | 2 | 3 | 4 | 5
let k: mytType
let l: mytType
